#pragma once

#include <cstdint>
#include <functional>

#include <driver/gpio.h>
#include <esp_timer.h>

/**
 * @brief 背光控制基类
 * 
 * 提供背光亮度控制和平滑过渡功能
 */
class Backlight {
public:
    /**
     * @brief 构造函数
     */
    Backlight();
    
    /**
     * @brief 析构函数
     */
    ~Backlight();

    /**
     * @brief 恢复保存的背光亮度
     */
    void RestoreBrightness();
    
    /**
     * @brief 设置背光亮度
     * 
     * @param brightness 亮度值(0-255)
     * @param permanent 是否永久保存此亮度设置
     */
    void SetBrightness(uint8_t brightness, bool permanent = false);
    
    /**
     * @brief 获取当前背光亮度
     * 
     * @return 当前亮度值
     */
    inline uint8_t brightness() const { return brightness_; }

protected:
    /**
     * @brief 亮度过渡定时器回调
     */
    void OnTransitionTimer();
    
    /**
     * @brief 设置背光亮度的具体实现
     * 
     * @param brightness 亮度值(0-255)
     */
    virtual void SetBrightnessImpl(uint8_t brightness) = 0;

    /**
     * @brief 过渡定时器句柄
     */
    esp_timer_handle_t transition_timer_ = nullptr;
    
    /**
     * @brief 当前亮度值
     */
    uint8_t brightness_ = 0;
    
    /**
     * @brief 目标亮度值
     */
    uint8_t target_brightness_ = 0;
    
    /**
     * @brief 每次过渡的亮度步进值
     */
    uint8_t step_ = 1;
};

/**
 * @brief PWM背光控制类
 * 
 * 使用PWM信号控制背光亮度
 */
class PwmBacklight : public Backlight {
public:
    /**
     * @brief 构造函数
     * 
     * @param pin 背光控制引脚
     * @param output_invert 是否反转输出信号
     */
    PwmBacklight(gpio_num_t pin, bool output_invert = false);
    
    /**
     * @brief 析构函数
     */
    ~PwmBacklight();

    /**
     * @brief 实现背光亮度设置
     * 
     * @param brightness 亮度值(0-255)
     */
    void SetBrightnessImpl(uint8_t brightness) override;
};
